home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / data / etc / lboss04.lzh / main.c < prev    next >
C/C++ Source or Header  |  1999-05-18  |  5KB  |  252 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <XSP2lib.H>
  5. #include <pcm8afnc.h>
  6. #include <sys/dos.h>
  7. #include <sys/iocs.h>
  8. #include "main.h"
  9. #include "fxsp2lib.h"
  10.  
  11.  
  12. #define    PCG_MAX    1024        /* スプライトPCGパターン最大使用数 */
  13. #define    REF_MAX    1024        /* 複合スプライトリファレンスデータ最大使用数 */
  14. #define    FRM_MAX    1024        /* 複合スプライトフレームデータ最大使用数 */
  15. #define RGB(r,g,b) ((g)<<11|(r)<<6|(b)<<1)
  16.  
  17. static char pcg_alt[PCG_MAX + 1];    /* PCG配置管理テーブル */
  18. static char pcg_dat[PCG_MAX * 128];    /* PCGデータファイル読み込みバッファ */
  19. static int old_crtmod;
  20.  
  21. char f_option_flag = 0;
  22. char end_of_data = 0;
  23.  
  24.  
  25.  
  26. void usage (void)
  27. {
  28.     printf ("中ボステストパターン表示&作成 main.x ver0.01\n"
  29.         "        programmed by Mitsuky <FreeSoftware>\n"
  30.     );
  31. }
  32.  
  33. /* 起動時のファイル読み込み */
  34. /* 読み込みに失敗した場合はいきなり終了するので注意 */
  35. int load_file (char *fname, void *ptr, size_t size, size_t n)
  36. {
  37.     FILE *fp;
  38.     int i;
  39.  
  40.     if ((fp = fopen (fname, "rb")) == NULL) {
  41.         //fatal_error (ERROR_FILE, fname);
  42.         printf ("%s が読めません\n", fname);
  43.     }
  44.     i = fread (ptr, size, n, fp);
  45.     fclose (fp);
  46.  
  47.     return (i);        /* 返り値は読み込みバイト数 */
  48. }
  49.  
  50.  
  51. void wait_vdisp (void)
  52. {
  53.     int sp;
  54.     sp = _iocs_b_super (0);
  55.     while ((*(volatile unsigned char *) 0xe88001) & 0x10 == 0);
  56.     while ((*(volatile unsigned char *) 0xe88001) & 0x10);
  57.     _iocs_b_super (sp);
  58. }
  59.  
  60.  
  61.  
  62. void init (void)
  63. {
  64.     int i, sp;
  65.     unsigned short *s, *d;
  66.     unsigned short pal_dat[16 * 15];    /* パレットデータファイル読み込みバッファ */
  67.     unsigned short crtcdata[9] =
  68.     {69, 6, 11 + 8, 59 - 8, 567, 5, 40, 552, 785};
  69.     unsigned short textpalet[16] =
  70.     {0, RGB (16, 16, 20), RGB (12, 12, 20), RGB (28, 28, 31), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  71.  
  72.     old_crtmod = _iocs_crtmod (-1);
  73.     _iocs_b_curoff ();
  74.     wait_vdisp ();
  75.     _iocs_crtmod (14);    /* 256*256dot 31kHz 65536色 */
  76.     _iocs_g_clr_on ();
  77.     _iocs_b_curoff ();
  78.     _iocs_ms_curof ();
  79.     _iocs_skey_mod (0, 0, 0);
  80.  
  81.     //sp = _iocs_b_super (0);
  82.     //*(unsigned short *) 0xe82600 &= 0xff80;    /* 画面表示全オフ */
  83.     //_iocs_b_super (sp);
  84.  
  85.  
  86.     _iocs_sp_init ();
  87.     _iocs_sp_on ();        /* スプライト表示をON */
  88.     _iocs_bgctrlst (0, 0, 0);    /* BG0表示OFF */
  89.     _iocs_bgctrlst (1, 1, 0);    /* BG1表示OFF */
  90.  
  91.  
  92.     /* 256x256 正方形モードを作る */
  93.     sp = _iocs_b_super (0);
  94.     *(unsigned short *) 0xe80028 = crtcdata[8];
  95.     d = (unsigned short *) 0xe80002;
  96.     for (i = 1; i < 8; i++)
  97.         *d++ = crtcdata[i];
  98.     *(unsigned short *) 0xe80000 = crtcdata[0];
  99.  
  100.     *(unsigned short *) 0xe8e006 |= 0b10;    /* HRL ビット */
  101.     *(unsigned short *) 0xeb080c = crtcdata[2] + 4;
  102.     *(unsigned short *) 0xeb080a = crtcdata[0];    /* スプライト */
  103.     *(unsigned short *) 0xeb080e = crtcdata[6];
  104.  
  105.     *(unsigned short *) 0xe82500 = 0b01001001001110;    /* 優先順位 TX>SP>GR */
  106.     _iocs_b_super (sp);
  107.  
  108.     load_file ("LBOSS04.SP", pcg_dat, sizeof (char), 128 * PCG_MAX);
  109.     load_file ("otoko.PAL", pal_dat, 2, 16 * 15);
  110.  
  111.     /* パレットに転送 */
  112.     sp = _iocs_b_super (0);
  113.     s = (unsigned short *) 0xe82200;
  114.     for (i = 0; i < 16; i++)
  115.         *s++ = textpalet[i];
  116.     d = pal_dat;
  117.     for (i = 0; i < 15 * 16; i++)
  118.         *s++ = *d++;
  119.     _iocs_b_super (sp);
  120.  
  121.     {
  122.         struct _lineptr lp;
  123.         lp.x1 = 0;
  124.         lp.y1 = 128;
  125.         lp.x2 = 255;
  126.         lp.y2 = 128;
  127.         lp.color = 0xf800;
  128.         lp.linestyle = 0xaaaa;
  129.         _iocs_line (&lp);
  130.         lp.x1 = 128;
  131.         lp.y1 = 0;
  132.         lp.x2 = 128;
  133.         lp.y2 = 255;
  134.         _iocs_line (&lp);
  135.     }
  136.     seq_init0 ();
  137.     EnemyInit0 ();
  138.  
  139.     _dos_breakck (2);    /* BREAK チェックを殺す */
  140.  
  141.     if (f_option_flag)
  142.         fxsp_on ();
  143.     xsp_on ();
  144.     xsp_mode (2);
  145.     xsp_pcgdat_set (pcg_dat, pcg_alt, sizeof (pcg_alt));
  146.     //xsp_objdat_set (ref_dat);
  147.     //pcm8a_vsyncint_on ();
  148.  
  149.     //sp = _iocs_b_super (0);
  150.     //*(unsigned short *) 0xe82600 |= 0x007f;    /* 画面表示オン */
  151.     //_iocs_b_super (sp);
  152. }
  153.  
  154.  
  155. int tini (void)
  156. {
  157.     int sp;
  158.  
  159.     //pcm8a_vsyncint_off ();
  160.     xsp_off ();
  161.     if (f_option_flag){
  162.         fxsp_off ();
  163.         fcloseall();
  164.     }
  165.  
  166.     EnemyTini ();
  167.  
  168.     wait_vdisp ();
  169.  
  170.     sp = _iocs_b_super (0);
  171.     *(unsigned short *) 0xe8e006 &= 0xfffd;    /* HRL ビット */
  172.     _iocs_b_super (sp);
  173.  
  174.     _iocs_skey_mod (-1, 0, 0);
  175.     _iocs_b_curon ();
  176.     _iocs_crtmod (old_crtmod);
  177.  
  178.     return (0);
  179. }
  180.  
  181.  
  182.  
  183. void game (void)
  184. {
  185.     seq_init ();
  186.  
  187.     for (;;) {
  188.         do {
  189.             seq_move ();
  190.             EnemyMove ();
  191.             xsp_out ();
  192.             if (f_option_flag)
  193.                 fxsp_out ();
  194.             if (f_option_flag && end_of_data)
  195.                 break;
  196.         } while ((_iocs_ms_getdt ()& 0xffff) == 0);
  197.         if (f_option_flag || (_iocs_ms_getdt ()& 0x00ff))
  198.             break;
  199.         EnemyTini ();
  200.         seq_init ();
  201.     }
  202. }
  203.  
  204.  
  205.  
  206. int main (int argc, char *argv[])
  207. {
  208.     int i;
  209.     int slash_flag = 0;
  210.     int fname_found_flag = 0;    /* ファイル名が1つでもあったか */
  211.  
  212.     {
  213.         char *temp;
  214.  
  215.         temp = getenv ("SLASH");
  216.         if ((temp != NULL) && (*temp == '/')) {
  217.             slash_flag = 1;
  218.         }
  219.     }
  220.  
  221.     for (i = 1; i < argc; i++) {
  222.         if (('-' == *argv[i]) || ((slash_flag == 0) && ('/' == *argv[i]))) {
  223.             switch (*(argv[i] + 1)) {
  224.  
  225.             case 'f':
  226.             case 'F':
  227.                 f_option_flag = !0;
  228.                 break;
  229.  
  230.             default:
  231.                 usage ();
  232.                 return (-1);
  233.             }
  234.         } else {
  235.             fname_found_flag = 1;
  236.         }
  237.     }
  238.  
  239. #if    0
  240.     if (fname_found_flag == 0) {
  241.         usage ();
  242.         return (-1);
  243.     }
  244. #endif
  245.     init ();
  246.     game ();
  247.  
  248.     tini ();
  249.  
  250.     return (0);
  251. }
  252.